#ifndef __tenacitas_log__text_file__h__
#define __tenacitas_log__text_file__h__


// =============================================================================
/** @file */

// =============================================================================
/** todo */

// =============================================================================
//                                 C++ Headers
#include <string>
#include <cstdint>
#include <sstream>
#include <fstream>
#include <memory>
#include <chrono>
#include <cstdio>

// =============================================================================
//                                 3rds Headers
#include <boost/thread/thread.hpp>

// =============================================================================
//                                 Our Headers
#include "level.h"
#include "file_writer.h"

// =============================================================================
//                                 Namespaces
using namespace std;


// =============================================================================
//                                 Macro Contants
/** */

// =============================================================================
//                                 Macro Commands
/** */


/** namespace of the organization */
namespace tenacitas {
    namespace log {

        // =========================== Typedefs ===========================

        // ============================ Pre-Declarations ==================

        // ============================ Attributes ========================
        /** */

        // ============================ Functions =========================


        // ============================ Classes ===========================

        
        /** */
        template<>
        class file_writer<txt_file_mode> {

        public:

            /** */
            typedef file_writer writer;

            /** */
            typedef std::shared_ptr<writer> ptr;
            
            /** */
            static ptr create( ) {
                return ( ptr( new writer( ) ) );
            }
            
            
            // /** */
            // void open( ofstream & p_file, const std::string & p_file_name ) {
            //     p_file.open( p_file_name.c_str( ), std::ios::out );
            //     p_file << "text-format v1";
            // }

            /** */
            void new_line( ofstream & p_file,
                           level p_level,
                           const char * p_file_name,
                           const char * p_function,
                           int64_t p_line ) {
                p_file << std::endl << p_level.str( ) << "|"
                       << std::chrono::nanoseconds ( std::chrono::
                                                     high_resolution_clock::now().
                                                     time_since_epoch() ).count( )
                       << "|" << p_file_name
                       << "|" << p_function
                       << "|" << p_line
                       << "|";
                p_file.flush( );
                
            }

            /** */
            template <typename t_data>
            void write ( ofstream & p_file, const t_data & p_data ) {
                p_file << p_data;
                p_file.flush( );
            }

            /** */
            typedef txt_file_mode file_mode;
        };
        
        

    }
}


// =============================================================================
//                     I M P L E M E N T A T I O N
// =============================================================================

using namespace tenacitas::log;


#endif
